package com.draven.mall.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.draven.mall.entity.Order;

import java.util.List;
import java.util.Map;

/**
 * 订单服务接口
 */
public interface OrderService extends IService<Order> {

    /**
     * 分页查询待接单的订单
     * @param page 页码
     * @param size 每页大小
     * @return 订单分页数据
     */
    Map<String, Object> getAvailableOrders(Integer page, Integer size);
    
    /**
     * 骑手接单
     * @param orderId 订单ID
     * @param riderId 骑手ID
     * @return 是否成功
     */
    boolean takeOrder(Long orderId, Long riderId);
    
    /**
     * 骑手完成订单
     * @param orderId 订单ID
     * @param riderId 骑手ID
     * @return 是否成功
     */
    boolean completeOrder(Long orderId, Long riderId);
    
    /**
     * 分页查询骑手的配送中订单
     * @param riderId 骑手ID
     * @param page 页码
     * @param size 每页大小
     * @return 订单分页数据
     */
    Map<String, Object> getInProgressOrders(Long riderId, Integer page, Integer size);
    
    /**
     * 分页查询骑手的已完成订单
     * @param riderId 骑手ID
     * @param page 页码
     * @param size 每页大小
     * @return 订单分页数据
     */
    Map<String, Object> getCompletedOrders(Long riderId, Integer page, Integer size);

    /**
     * 用户下单后，创建订单
     * @param order 订单信息
     * @return 订单ID
     */
    Long createOrder(Order order);
    
    /**
     * 系统自动分配订单给骑手
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean assignOrderToRider(Long orderId);
    
    /**
     * 根据ID获取订单详情
     * @param orderId 订单ID
     * @return 订单信息
     */
    Order getOrderById(Long orderId);
    
    /**
     * 获取所有订单（用于管理员监控）
     * @param params 包含页码、每页数量和筛选条件的Map
     * @return 订单分页数据
     */
    Map<String, Object> getAllOrders(Map<String, Object> params);
    
    /**
     * 获取订单统计数据
     * @param params 包含时间范围等过滤条件的Map
     * @return 统计数据
     */
    Map<String, Object> getOrderStatistics(Map<String, Object> params);
    
    /**
     * 获取订单状态分布
     * @return 各状态订单数量
     */
    Map<String, Object> getOrderStatusDistribution();
    
    /**
     * 获取实时订单流量
     * @param granularity 时间颗粒度（hour/day/week）
     * @return 订单流量数据
     */
    Map<String, Object> getOrderRealTimeFlow(String granularity);
    
    /**
     * 获取异常订单
     * @param page 页码
     * @param size 每页大小
     * @return 异常订单分页数据
     */
    Map<String, Object> getAbnormalOrders(Integer page, Integer size);

    /**
     * 获取商家订单排行
     * 
     * @param params 查询参数
     * @return 商家排行列表
     */
    List<Map<String, Object>> getMerchantRanking(Map<String, Object> params);

    /**
     * 获取订单详情与商品信息
     * @param orderId 订单ID
     * @return 包含商品信息的订单详情
     */
    Map<String, Object> getOrderDetailWithItems(Long orderId);
    
    /**
     * 更新订单的骑手ID
     * @param orderId 订单ID
     * @param riderId 骑手ID
     * @return 是否成功
     */
    boolean updateOrderRider(Long orderId, Long riderId);
    
    /**
     * 用户对骑手进行评分
     * @param orderId 订单ID
     * @param riderId 骑手ID
     * @param rating 评分(1-5)
     * @param comment 评价内容
     * @return 是否成功
     */
    boolean rateRider(Long orderId, Long riderId, Float rating, String comment);
} 